/*
@ClassName WebSocketController
@Description TODO
@Author SubUp
@Date   2022/8/4
@Version 1.0
*/

package com.sunjob.mrojobschedule.controller;

import com.sunjob.common.domain.scheduleServer.JobSchedule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;

@ServerEndpoint(value = "/websocket")
@Component
public class WebSocketController {
    //保存所有在线socket连接
    private static Map<String,WebSocketController> webSocketMap = new LinkedHashMap<>();

    //记录当前在线数目
    private static int count=0;

    //当前连接（每个websocket连入都会创建一个WebSocketController实例
    private Session session;

    private Logger log = LoggerFactory.getLogger(this.getClass());

    //当前发消息的人员编号
    private String enter = "";
    /**
     * 处理连接建立
     * 连接建立成功调用的方法
     *
     * @param session 可选的参数。session为与某个客户端的连接会话，需要通过它来给客户端发送数据
     */
    @OnOpen
    public void onOpen(Session session){
        this.session=session;
        webSocketMap.put(session.getId(),this);
        addCount();
        log.info("新的连接加入：{}",session.getId());
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送过来的消息
     * @param session 可选的参数
     */
//    @SuppressWarnings("unused")
////    @OnMessage
//    public void onMessage(String message,Session session){
//        log.info("收到客户端{}消息：{}",session.getId(),message);
//        try{
//            webSocketMap.forEach((k,v)->{
//                try {
//                    if(message.contains(v.session.getId())){
//                        v.sendMessage(message+v.session.getId());
//                    }else{
//                        v.sendMessage("没有收到信息"+v.session.getId());
//                    }
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            });
//
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//    }
    /**
     * 给指定的人发送消息//群发
     * @param message
     */
    @OnMessage
    public void sendToUser(String message) {
//        String sendUserNo = message.split("[|]")[1];
//        String sendMessage = message.split("[|]")[0];
//        String now = getNowTime();
//        try {
//            if (webSocketMap.get(sendUserNo) != null) {
//                webSocketMap.get(sendUserNo).sendMessage(now + "用户" + enter + "发来消息：" + " <br/> " + sendMessage);
//            } else {
//                System.out.println("当前用户不在线");
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
        //向所有人发送数据
//        webSocketMap.forEach((k,v)->{
//            try {
//                v.sendMessage(message);
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        });
        log.info(message+"--"+webSocketMap.size());
        String[] strings = message.split(",");
        String userNo = strings[0];
        String content = strings[1];
        String nowTime = getNowTime();
        try {
            if (webSocketMap.get(userNo) != null) {
                webSocketMap.get(userNo).sendMessage(nowTime + "用户" + userNo + "发来消息：" + " <br/> " + content);
            } else {
                System.out.println("当前用户不在线");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
//        try {
//            if(session.getId().equals("1"))
//                sendMessage(message+webSocketMap.size());
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        webSocketMap.forEach((k,v)->{
//            if(v.session.getId().equals("1")){
//                try {
//                    v.sendMessage("来消息了");
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        });
//        try {
//            sendMessage(message);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
    }

    //处理错误
    @OnError
    public void onError(Throwable error, Session session){
        log.info("发生错误{},{}",session.getId(),error.getMessage());
        error.printStackTrace();
    }

    //处理连接关闭
    @OnClose
    public void onClose(){
        webSocketMap.remove(this.session.getId());
        reduceCount();
        log.info("连接关闭:{}",this.session.getId());
    }

    //群发消息

    //发送文本消息
    public void sendMessage(String message) throws IOException {
        this.session.getAsyncRemote().sendText(message);
//        this.session.getBasicRemote().sendText(message);
    }
//    //发送
//    public void sendDataBinary(Object obj) throws IOException{
//        this.session.getAsyncRemote().sendObject(obj);
//    }

//    //广播消息
    public static void broadcast(){
        WebSocketController.webSocketMap.forEach((k,v)->{
            try{
                v.sendMessage(k+",这是一条测试广播:"+webSocketMap);
                JobSchedule jobSchedule = new JobSchedule();
//                v.sendDataBinary(jobSchedule);
            }catch (Exception e){
            }
        });
    }

    //获取在线连接数目
    public static int getCount(){
        return count;
    }

    //操作count，使用synchronized确保线程安全
    public static synchronized void addCount(){
        WebSocketController.count++;
    }

    public static synchronized void reduceCount(){
        WebSocketController.count--;
    }

    /**
     * 给所有人发消息
     * @param message
     */
    private void sendAll(String message) {
        String now = getNowTime();
        String sendMessage = message.split("[|]")[0];
        //遍历HashMap
        for (String key : webSocketMap.keySet()) {
            try {
                //判断接收用户是否是当前发消息的用户
                if (!enter.equals(key)) {
                    webSocketMap.get(key).sendMessage(now + "用户" + enter + "发来消息：" + " <br/> " + sendMessage);
                    System.out.println("key = " + key);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 获取当前时间
     *
     * @return
     */
    private String getNowTime() {
        Date date = new Date();
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = format.format(date);
        return time;
    }
}
